<?php
namespace Home\Model;
use Think\Model;
class CategoryModel extends Model {
    protected $trueTableName = 'category';

    /**
     * 获取导航数据, 将导航数据写入memcache
     */
    private function get_nav() {
        $cate_model = M('category');
        $cate_data = $cate_model->order('cate_path')->select();
        return $this->get_category($cate_data, 0, 2);
    }

    /**
     * 获取分类详细信息
     * @param  milit   $id 分类ID或标识
     * @param  boolean $field 查询字段
     * @return array     分类信息
     */
    public function info($id, $field = true){
        /* 获取分类信息 */
        $map = array();
        if(is_numeric($id)){ //通过ID查询
            $map['id'] = $id;
        } else { //通过标识查询
            $map['cate_name'] = $id;
        }
        return $this->field($field)->where($map)->find();
    }

    /**
     * 获取分类树，指定分类则返回指定分类极其子分类，不指定则返回所有分类树
     * @param  integer $id    分类ID
     * @param  boolean $field 查询字段
     * @return array          分类树
     * @author 麦当苗儿 <zuojiazi@vip.qq.com>
     */
    public function getTree($id = 0, $field = true){
        /* 获取当前分类信息 */
        if($id){
            $info = $this->info($id);
            $id   = $info['id'];
        }

        /* 获取所有分类 */
        $map  = array('status' => 1);
        $list = $this->field($field)->where($map)->order('cate_path')->select();
        $list = list_to_tree($list, $pk = 'id', $pid = 'pid', $child = 'child', $root = $id);
        
        /* 获取返回数据 */
        if(isset($info)){ //指定分类则返回当前分类极其子分类
            $info['child'] = $list;
        } else { //否则返回所有分类
            $info = $list;
        }

        return $info;
    }

    /**
     * 获取指定分类的同级分类
     * @param  integer $id    分类ID
     * @param  boolean $field 查询字段
     * @return array
     * @author 麦当苗儿 <zuojiazi@vip.qq.com>         
     */
    public function getSameLevel($id, $field = true){
        $info = $this->info($id, 'pid');
        $map = array('pid' => $info['pid'], 'status' => 1);
        return $this->field($field)->where($map)->order('cate_path')->select();
    }

    /**
     * 更新分类信息
     * @return boolean 更新状态
     * @author 麦当苗儿 <zuojiazi@vip.qq.com>
     */
    public function update(){
        $data = $this->create();
        if(!$data){ //数据对象创建错误
            return false;
        }

        /* 添加或更新数据 */
        return empty($data['id']) ? $this->add() : $this->save();
    }

    /**
     * 获取指定分类子分类ID
     * @param  string $cate 分类ID
     * @return string       id列表
     * @author 麦当苗儿 <zuojiazi@vip.qq.com>
     */
    public function getChildrenId($cate){
        $field = 'id,cate_name,pid';
        $category = D('Category')->getTree($cate, $field);
        $ids = array();
        foreach ($category['child'] as $key => $value) {
            $ids[] = $value['id'];
        }
        return implode(',', $ids);
    }

    /**
     * 获取导航无限极分类信息
     * @param $data 数据库中存放的分类数据
     * @param $pid  父级id
     * @param $layer 层级，表示要从中遍历出多少层的分类数据 1表示只取一层
     */
    private function get_category($data=array(), $pid=0, $layer)
    {
        $result = array();
        static $loop_count = 0;
        if($loop_count == $layer) return $result;

        foreach($data as $k=>$v) {
            if($v['pid'] == $pid) {
                //只有获取的数据超过一层的时候采取获取下层的数据
                if($layer > 1) {
                    $v['child'] = $this->get_category($data, $v['id'], $loop_count+1);
                }
                $result[] = $v;
            }
        }
        $loop_count++;
        return $result;
    }

    /**
     * 获得最底层的分类的id，因为商品绑定在最下面的一层分类上
     * @param  [type] $cate_id 要查找的父分类id
     * @param  array  $list    当前分类下的 tree_list
     * @return [type]          [description]
     */
    public function get_deep_children_ids($list)
    {
        static $ids = array();

        if (empty($list['child'])) {
            $ids[] = $list['id'];
        } else {
            foreach ($list['child'] as $key => $value) {
                $this->get_deep_children_ids($value);
            }
        }
        return implode(',', $ids);
    }

}